class SmaCrossCons(ConsStrategy):
    # Class variable for parameters tuning
    fast_days = 5
    slow_days = 15
    def init(self):
        super().init()
        self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
        self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
        self.conservative = True
    def next(self):
        if crossover(self.fast_line, self.slow_line):
            if len(self.trades) > 0:
                self.trades[0].close()
            self.buy()
        elif crossover(self.slow_line, self.fast_line):
            if len(self.trades) > 0:
                self.trades[0].close()
            if self.conservative == False:
                self.sell()
super().init():繼承Strategy的初始化函式。params(self):用來記錄訓練後參數。
class ConsStrategy(Strategy):
    def init(self):
        super().init()
        self.conservative = True
    @property
    def params(self):
        return self._params
參數可藉由
backtesting.optimize()進行參數優化。
# Class variable for parameters tuning
fast_days = 5
slow_days = 15
def init(self):
    super().init()
    self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
    self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
    self.conservative = True
def next(self):
    if crossover(self.fast_line, self.slow_line):
        if len(self.trades) > 0:
            self.trades[0].close()
        self.buy()
    elif crossover(self.slow_line, self.fast_line):
        if len(self.trades) > 0:
            self.trades[0].close()
        if self.conservative == False:
            self.sell()
該語法會將之前的操作清空,作用等同於
exclusive_orders=True。
if len(self.trades) > 0:
    self.trades[0].close()
策略為激進時
self.conservative = False,允許賣空。
if self.conservative == False:
    self.sell()
test = Backtest(
    data=df,
    strategy=SmaCrossCons,
    cash=10000000,
    commission=0.004,
    exclusive_orders=True,
    hedging = True,
    trade_on_close=True,
)
strategy:回測策略。cash:本金。commission:交易手續費。hedging:若為True時,優先對之前操作進行抵銷。
Sell(1100)、Buy(1000) -> 賣空100Sell(1000)、Buy(1100) -> 買空100Sell(1000)、Sell(1100) -> 賣空2100exclusive_orders:若為True時,每次操作前自動關閉(close)上次操作。
Buy(500)、Buy(1000) -> 最後持股1000Buy(500)、Sell(500) -> 賣空500trade_on_close:於收盤時交易,否則預設於開盤交易。對參數進行優化,尋找該策略下的最佳參數,
參數必須為Strategy的Class variable。
constraint:限定組合必須符合特定條件
result = test.optimize(
    fast_days=[5,10,15],
    slow_days=[10,15,20],
    constraint=lambda p: p.fast_days < p.slow_days,
)
最後的測試組合為:(5,10), (5,15), (5,20), (10,15), (10,20), (15,20)。
backtesting你的文檔可以寫得再爛點沒關係。